package controllers

import (
	"go-api-demo/database"
	"go-api-demo/models"
	"net/http"

	"github.com/gin-gonic/gin"
	"golang.org/x/crypto/bcrypt"
)

// Profile godoc
// @Summary 获取当前用户信息
// @Description 获取当前登录用户的详细资料（需要携带JWT）
// @Tags 用户模块
// @Security Bearer
// @Produce json
// @Success 200 {object} map[string]interface{} "成功返回用户信息"
// @Failure 401 {object} map[string]interface{} "未授权或Token无效"
// @Failure 404 {object} map[string]interface{} "用户不存在"
// @Router /profile [get]
func Profile(c *gin.Context) {
	userID := c.GetUint("user_id")

	var user models.User
	if err := database.DB.First(&user, userID).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "用户不存在"})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"id":       user.ID,
		"username": user.Username,
		"created":  user.CreatedAt,
	})
}

// UpdateProfile godoc
// @Summary 更新当前用户信息
// @Description 修改当前用户的用户名或密码（需要JWT认证）
// @Tags 用户模块
// @Security Bearer
// @Accept json
// @Produce json
// @Param data body map[string]interface{} true "要更新的字段（username 或 password）"
// @Success 200 {object} map[string]interface{} "更新成功"
// @Failure 400 {object} map[string]interface{} "参数错误或未提供字段"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Failure 500 {object} map[string]interface{} "服务器错误"
// @Router /profile [put]
func UpdateProfile(c *gin.Context) {
	userID := c.GetUint("user_id")

	var req models.User
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
		return
	}

	updates := map[string]interface{}{}

	if req.Username != "" {
		updates["username"] = req.Username
	}

	if req.Password != "" {
		hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
		updates["password"] = string(hashedPassword)
	}

	if len(updates) == 0 {
		c.JSON(http.StatusBadRequest, gin.H{"error": "没有提供任何更新字段"})
		return
	}

	if err := database.DB.Model(&models.User{}).Where("id = ?", userID).Updates(updates).Error; err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "更新失败"})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "更新成功"})
}

// DeleteAccount godoc
// @Summary 删除当前账号
// @Description 删除当前登录的用户账号（软删除）
// @Tags 用户模块
// @Security Bearer
// @Produce json
// @Success 200 {object} map[string]interface{} "账号已删除"
// @Failure 401 {object} map[string]interface{} "未授权"
// @Failure 500 {object} map[string]interface{} "删除失败"
// @Router /profile [delete]
func DeleteAccount(c *gin.Context) {
	userID := c.GetUint("user_id")

	if err := database.DB.Delete(&models.User{}, userID).Error; err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "删除失败"})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "账号已删除"})
}
